#include "add_ocr_text.h"

//写入某图像的OCR信息
void Write_picture_ocr_info(std::pair <double, double> page_size_pair, //页面大小
                            PDFWriter * pdfWriter, //PDF 写入对像
                            PDFUsedFont* use_font, //PDF 字体
                            bool draw_rectangle_bool, // 是否画出矩形文本框
                            AbstractContentContext::GraphicOptions pathStrokeOptions, //矩形文本框样式
                            std::string pic_name, //图片名
                            const int origin_position, //OCR图片结果中坐标的原点位置
                            std::vector <std::pair<int, int>> * info_coord_1, //相应数据
                            std::vector <std::pair<int, int>> * info_coord_2,
                            std::vector <std::pair<int, int>> *  info_coord_3,
                            std::vector <std::pair<int, int>> * info_coord_4,
                            std::vector <std::string> * info_text,
                            const int i_start, //相关内容的索引编号
                            const int i_end )
{
    EStatusCode status;
    
    std::pair <double, double> pic_dimensions; //图片尺寸
    double scale_ratio; //图像缩放比例
    std::pair <double, double> pic_position; //图片放置位置
    double font_size; //字体大小
    
    
    
    //获取图像的尺寸，单位是像素
    pic_dimensions = (*pdfWriter).GetImageDimensions(pic_name);
    
    
    //将图片的坐标原点换算为当前左下角的坐标原点
    Coordinate_origin_transform(info_coord_1, info_coord_2, info_coord_3, info_coord_4, pic_dimensions, origin_position,i_start,i_end);
    
    
    //计算图片的缩放比例
    scale_ratio=Get_picture_scale(page_size_pair,pic_dimensions);
    
    pic_dimensions.first*=scale_ratio; //利用缩放比例，重新得到图像大小
    pic_dimensions.second*=scale_ratio;
    
    
    //图片在页面中的位置计算
    pic_position=Get_PicInPage_position(page_size_pair,pic_dimensions);
    
    
    //根据图片的位置，及缩放，重新计算文本框各点坐标
    Get_new_box_coordinate(info_coord_1,info_coord_2,info_coord_3,info_coord_4, scale_ratio,pic_position,i_start,i_end);
    
    
    //创建 PDF 页面，后面的操作，都是针对此页
    PDFPage* pdfPage = new PDFPage();
    pdfPage->SetMediaBox( PDFRectangle(0,0,page_size_pair.first,page_size_pair.second) ); //PDF页面大小
    
    // Create a content context for the page
    PageContentContext* pageContentContext = (*pdfWriter).StartPageContentContext(pdfPage);
    
    
    /*
     *    //两种图片写入方式，采用后一种
     *    //Create an image object from image
     *    PDFFormXObject* image = pdfWriter.CreateFormXObjectFromPNGFile(pic_name);
     *    
     *    if(!image)
     *    {
     *        status = eFailure;
     *        break;
}

// Place the image in the center of the page
pageContentContext->q();
pageContentContext->cm(1,0,0,1,0,0);
pageContentContext->Do(pdfPage->GetResourcesDictionary().AddFormXObjectMapping(image->GetObjectID()));
pageContentContext->Q();

delete image; // Image object can be deleted right after i was used
*/
    
    
    //第二种图片写入方式
    AbstractContentContext::ImageOptions opt3; //图片参数设定，如缩放
    opt3.transformationMethod = AbstractContentContext::eMatrix;
    opt3.matrix[0] = opt3.matrix[3] = scale_ratio;
    
    pageContentContext->DrawImage(pic_position.first,pic_position.second,pic_name,opt3);//写入图片，这里似乎没有写入成功检查？
    
    
    // 在图像之上，创建一个文字层
    for(int j=i_start; j < i_end; j++)
    {
        if( draw_rectangle_bool )
        {
            //画出文本框，仅用于微调其大小
            pageContentContext->DrawRectangle((*info_coord_1)[j].first, (*info_coord_1)[j].second,
                                              abs((*info_coord_1)[j].first-(*info_coord_2)[j].first),
                                              abs((*info_coord_1)[j].second-(*info_coord_4)[j].second),
                                              pathStrokeOptions);
        }else
        {
            font_size=Get_text_font_size(&(*info_coord_1)[j],&(*info_coord_2)[j],&(*info_coord_3)[j],&(*info_coord_4)[j],
                                         &(*info_text)[j],use_font);
            
            pageContentContext->BT(); //字符串开始
            pageContentContext->Tr(3); //显示模式： 正常 0 、隐藏文字 3
            pageContentContext->k(0,0,0,1); //字颜色：黑色 （CMYK）
            pageContentContext->Tf(use_font,font_size); //字体和大小
            pageContentContext->Tm(1,0,0,1,(*info_coord_1)[j].first, (*info_coord_1)[j].second); //起始位置(90,610)
            pageContentContext->Tj((*info_text)[j]);
            pageContentContext->ET(); //字符串结束  
        }
    }
    
    
    // End content context, and write the page
    status = (*pdfWriter).EndPageContentContext(pageContentContext);
    if(status != eSuccess)
    {
        std::cout << "pageContentContext 存在问题" << std::endl;
        exit(0);
    }
    
    status = (*pdfWriter).WritePageAndRelease(pdfPage);
    if(status != eSuccess)
    {
        std::cout << "PDF 写入页面失败" << std::endl;
        exit(0);
    }
}

 
